<?php
 
 
namespace D3hdv\Diablo3Bundle\Controller;
 
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Response;
use D3hdv\Diablo3Bundle\Entity\D3Objet;
use D3hdv\Diablo3Bundle\Entity\D3ObjetModele;
use D3hdv\Diablo3Bundle\Entity\D3ObjetCarac;
use D3hdv\Diablo3Bundle\Entity\D3ObjetCaracValeur;
use D3hdv\Diablo3Bundle\Entity\D3ObjetClasse;
use D3hdv\Diablo3Bundle\Entity\D3Compte;
use D3hdv\Diablo3Bundle\Entity\D3Coffre;
use D3hdv\Diablo3Bundle\Entity\D3CoffreD3Objet;
use D3hdv\Diablo3Bundle\Form\D3ObjetModeleType;
use D3hdv\Diablo3Bundle\Form\D3GenererObjetForm;
use D3hdv\Diablo3Bundle\Form\D3GenererCompteForm;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\Security\Core\Encoder\MessageDigestPasswordEncoder;

class AdminController extends Controller
{
  public function indexAction()
  {
     return $this->render('D3hdvDiablo3Bundle:Admin:index.html.twig');
  }


  
  public function GenererCompteAction()
  {
	$form = $this->container->get('form.factory')->create(new D3GenererCompteForm());
	
	return $this->container->get('templating')->renderResponse('D3hdvDiablo3Bundle:Admin:generercompte.html.twig', array(
		'form' => $form->createView()
	));	
  }
  
  public function AjouterObjetCompteAction($idcoffre,$idcompte)
  {
	$em = $this->getDoctrine()->getEntityManager();
	$D3Coffre = $em->getRepository('D3hdvDiablo3Bundle:D3Coffre')->find($idcoffre);
	$D3Compte = $em->getRepository('D3hdvDiablo3Bundle:D3Compte')->find($idcompte);
	for ($nombre_de_lignes = 0; $nombre_de_lignes <5; $nombre_de_lignes++)
	{
					//echo 'Ceci est la ligne n°' . $nombre_de_lignes . '<br />';

		$qb = $em->createQueryBuilder();

		$qb->select('d')
		->from('D3hdvDiablo3Bundle:D3Objet', 'd')
		->where("d.prise = ?1 ")
		->setParameter(1, 0);

		$query = $qb->getQuery();               
		$liste_Objet = $query->getResult();
		//return new Response($liste_Objet[0]->GetId());

		$rand_keys_objet = array_rand($liste_Objet, 1);
		$objet_choose=$liste_Objet[$rand_keys_objet];
		$objet_choose->setPrise(true);

		$coffreobjet[$nombre_de_lignes]=new D3CoffreD3Objet;
		$coffreobjet[$nombre_de_lignes]->setD3Coffre($D3Coffre);
		$coffreobjet[$nombre_de_lignes]->setD3Objet($objet_choose);
		$coffreobjet[$nombre_de_lignes]->setenVente(false);

		$em->persist($coffreobjet[$nombre_de_lignes]);
		$em->flush();
	}
	return $this->container->get('templating')->renderResponse('D3hdvDiablo3Bundle:Admin:voir_compte.html.twig', array(
				    'coffreobjet' => $coffreobjet,
				    'D3Compte'=>$D3Compte				
				    ));
	

  }
  public function CreerCompteAction()
  {
  	$request = $this->container->get('request');
	
    	if($request->isXmlHttpRequest())
    	{	
		$i=0;
		$nbcompte="";
		$nbcompte=$request->request->get('ncompte');
		$coffreobjet=array();
		$coffre=array();
		$compte=array();
		$objet_choose =array();
		if($nbcompte !='')
		{	
		  	$em = $this->getDoctrine()->getEntityManager();
			
			for($i=0;$i<$nbcompte;$i++)
			{
				$Roles_user_D3 = $em->getRepository('D3hdvDiablo3Bundle:Role')->findByName("ROLE_USER_D3");
				$randsuffix=($i+rand()+100);
				$compte[$i] =new D3Compte;
				$compte[$i]->setUsername("user".$randsuffix);
				$compte[$i]->setEmail("user".$randsuffix."@Diablo3.net");
				$compte[$i]->setSalt(md5(time()));
 
				// On crée un mot de passe (attention, comme vous pouvez le voir, il faut utiliser les même paramètres
				// que spécifiés dans le fichier security.ym, a sacoir SHA512 avec 10 itérations.        
				$encoder = new MessageDigestPasswordEncoder('sha512', true, 10);
				// On cré donc le mot de passe "admin2" à partir de l'encodage choisi au-dessus
				$password = $encoder->encodePassword('12345', $compte[$i]->getSalt());
				// On applique le mot de passe à l'utilisateur
	
				$compte[$i]->setPassword($password);
				
				/*foreach($Roles_user_D3 as $i => $Role_user_D3)
				{*/
			 		$compte[$i]->addUserRole($Roles_user_D3[0]);
				//}
				$coffre[$i]=new D3Coffre;
				$coffre[$i]->setPieceOr(rand(5000000,25000000));
				$coffre[$i]->setArgent(rand(25,200));

				$em->persist($coffre[$i]);
				$em->flush();
				
				$compte[$i]->setCoffre($coffre[$i]);
				$em->persist($compte[$i]);
				$em->flush();
				
				$nombre_de_lignes = 0;
				for ($nombre_de_lignes = 0; $nombre_de_lignes <5; $nombre_de_lignes++)
				{
					//echo 'Ceci est la ligne n°' . $nombre_de_lignes . '<br />';


					$qb = $em->createQueryBuilder();

					$qb->select('d')
					->from('D3hdvDiablo3Bundle:D3Objet', 'd')
					->where("d.prise = ?1 ")
					->setParameter(1, 0);

					$query = $qb->getQuery();               
					$liste_Objet = $query->getResult();
					if(count($liste_Objet)>=5)
					{
						//return new Response($liste_Objet[0]->GetId());

						$rand_keys_objet = array_rand($liste_Objet, 1);
						$objet_choose[$nombre_de_lignes]=$liste_Objet[$rand_keys_objet];
						$objet_choose[$nombre_de_lignes]->setPrise(true);

						$coffreobjet[$nombre_de_lignes]=new D3CoffreD3Objet;
						$coffreobjet[$nombre_de_lignes]->setD3Coffre($coffre[$i]);
						$coffreobjet[$nombre_de_lignes]->setD3Objet($objet_choose[$nombre_de_lignes]);
						$coffreobjet[$nombre_de_lignes]->setenVente(false);

						$em->persist($coffreobjet[$nombre_de_lignes]);
						$em->flush();
					}
					else
					{
						echo "Erreur : Plus d'objet disponible allez en generer des nouveaux. </br>";
						for($ii = 0;$ii<$nombre_de_lignes; $ii++)
						{
					
							//echo "ii =".$ii."</br>";
							$em->remove($coffreobjet[$ii]);
							$objet_choose[$ii]->setPrise(false);
							$em->flush();
							
						}
						
						break;
					}
				}
				//echo "Nombre de ligne = ".$nombre_de_lignes.'</br>';
				if($nombre_de_lignes!=5)
				{
					echo 'Erreur : Plus assez d\'objet disponible ! Seulement '.$i.' comptes ont été crée ! Allez générer des nouveaux objets !! </br> Environ '.(($nbcompte-$i)*5).' => Pour '.($nbcompte-$i).' comptes restant à creer !! </br>';		

					$em->remove($compte[$i]);
					$em->flush();
					
					$em->remove($coffre[$i]);
					$em->flush();
					
					
					break;
				}
				else
				{	
					echo 'Compte '.$i.' crée !</br>';					//$em->flush();
				}
			}
			

		 }
		 else
		{
			return $this->render('D3hdvDiablo3Bundle:Admin:generercompte.html.twig');
		}
		$serializedEntity = $this->container->get('serializer')->serialize($compte, 'json');
		return new Response($serializedEntity);
	 }
	
	return new Response("Erreur pas de Ajax detecté");
  }

  public function GenererObjetAction()
  {
	$form = $this->container->get('form.factory')->create(new D3GenererObjetForm());
	
	return $this->container->get('templating')->renderResponse('D3hdvDiablo3Bundle:Admin:genererobjet.html.twig', array(
		'form' => $form->createView()
	));
  }

  public function CreerObjetAction()
  {
	$request = $this->container->get('request');

    if($request->isXmlHttpRequest())
    {
	$nbobjet="";
	$nbobjet=$request->request->get('nobjet');
	if($nbobjet !='')
        {		
		$em = $this->getDoctrine()->getEntityManager();
		$liste_Objet_Modele = $em->getRepository('D3hdvDiablo3Bundle:D3ObjetModele')->findAll();

		for($i=0;$i<$nbobjet;$i++)
		{
			$rand_keys_modele = array_rand($liste_Objet_Modele, 1);
			$objet_model_choose=$liste_Objet_Modele[$rand_keys_modele];
			
			$objet_Modele_spe_valeur=$objet_model_choose->getSpe();
			$objet_Modele_spe_valeur_explode=explode("-", $objet_Modele_spe_valeur);
			if(!is_numeric($objet_Modele_spe_valeur_explode[1]))
			{
				//echo $objet_model_choose->GetNom();
				/*$serializedEntity = $this->container->get('serializer')->serialize($objet_model_choose->GetNom(), 'json');
				return new Response($serializedEntity);*/
				 throw $this->createNotFoundException('Unable to valeur 1.'.$objet_model_choose->GetNom());
			}
			if(!is_numeric($objet_Modele_spe_valeur_explode[0]))
			{
				//echo $objet_model_choose->GetNom();
				/*$serializedEntity = $this->container->get('serializer')->serialize($objet_model_choose->GetNom(), 'json');
				return new Response($serializedEntity);*/
				 throw $this->createNotFoundException('Unable to valeur 0.'.$objet_model_choose->GetNom());
			}
			$rand_keys_spe = rand($objet_Modele_spe_valeur_explode[0], $objet_Modele_spe_valeur_explode[1]);

			$objet[$i] = new D3Objet;
			$objet[$i]->setObjetModele($objet_model_choose);
			$objet[$i]->setSpe($rand_keys_spe);
			$objet[$i]->setSpeRatio(($rand_keys_spe)/(($objet_Modele_spe_valeur_explode[0]+$objet_Modele_spe_valeur_explode[1])/2));
			$objet_Modele_caracteristiques=$objet_model_choose->getCaracteristiques();
			foreach($objet_Modele_caracteristiques as $j => $objet_Modele_caracteristique)
			{

				$objet_Modele_caracteristique_valeur=$objet_Modele_caracteristique->getValeurCara();
				$objet_Modele_caracteristique_valeur_explode=explode("-", $objet_Modele_caracteristique_valeur);
				$rand_keys = rand($objet_Modele_caracteristique_valeur_explode[0], $objet_Modele_caracteristique_valeur_explode[1]);
				$objet_Modele_caracteristique=$objet_Modele_caracteristique->getObjetCaracteristique();

				$liste_caracteristique[$j]= new D3ObjetCaracValeur();
				$liste_caracteristique[$j]->setValeurCara($rand_keys);
				$liste_caracteristique[$j]->setObjetCaracteristique($objet_Modele_caracteristique);
				$objet[$i]->addCaracteristique($liste_caracteristique[$j]);
				//return new Response($rand_keys);
			}	
			$em->persist($objet[$i]);

			$em->flush();
		}
		
	}
	else {
            return $this->render('D3hdvDiablo3Bundle:Admin:genererobjet.html.twig'); 
        }	
	 /*return $this->container->get('templating')->renderResponse('D3hdvDiablo3Bundle:Admin:genererobjet.html.twig', array(
            'objet' => $objet,
            ));*/
	/*$response = new Response(json_encode(array('objet' => $objet)));
	$response->headers->set('Content-Type', 'application/json');
	return new Response($response);*/
	
	$serializedEntity = $this->container->get('serializer')->serialize($objet, 'json');
	return new Response($serializedEntity);
	
     }
	return new Response("Erreur pas de Ajax detecté"); 
  }

  public function AjouterObjetModeleAction()
  {
	$objetModele = new D3ObjetModele;	
	$form = $this->createForm(new D3ObjetModeleType, $objetModele);
	$request = $this->container->get('request');
	if ($request->isXmlHttpRequest())
	{
	$myValue = $request->request->get('Type');
	
		$em = $this->container->get('doctrine')->getEntityManager();
		if($myValue==1)
		{
			$message = "1 main";
			$qb = $em->createQueryBuilder();

			$qb->select('D')
			->from('D3hdvDiablo3Bundle:D3ObjetClasse', 'D')
			->where("D.main >= 1");

			$query = $qb->getQuery();               
			$Classe = $query->getResult();
			$serializedEntity = $this->container->get('serializer')->serialize($Classe, 'json');			
			return new Response($serializedEntity);
		}	  
		else
		{	
			$message  = "2 mains";
			$qb = $em->createQueryBuilder();
			$qb->select('d')
			->from('D3hdvDiablo3Bundle:D3ObjetClasse', 'd')
			->where("d.main = ?1 ")
			->setParameter(1, 0);
			$query = $qb->getQuery();               
			$Classe = $query->getResult();
			$serializedEntity = $this->container->get('serializer')->serialize($Classe, 'json');
			return new Response($serializedEntity);
		}
			$serializedEntity = $this->container->get('serializer')->serialize($Classe, 'json');
			return new Response($serializedEntity);
	}
	else
	{
		$request = $this->get('request');
		if ($request->getMethod() == 'POST') 
		{
			$form->bind($request);
			if ($form->isValid()) 
			{
				$nomNewObjetModele= $form["nom"]->getData();
				//return new Response($nomNewObjetModele);
			
				
				$em = $this->getDoctrine()->getManager();
				$qb = $em->createQueryBuilder();

				$qb->select('D')
				->from('D3hdvDiablo3Bundle:D3ObjetModele', 'D')
				->where("D.nom = ?1")
				->setParameter(1, $nomNewObjetModele);

				$query = $qb->getQuery();               
				$RqObjetModele = $query->getResult();

				if(!empty($RqObjetModele)) // pas de compte trouvé
				{
					$erreur="Ce nom d objet Modele est déjà utilisé ! ";
					return $this->container->get('templating')->renderResponse('D3hdvDiablo3Bundle:Admin:ajouterobjetmodele.html.twig', array(
					'form' => $form->createView(),
					'erreur' => $erreur				
					));
				}
				
				$objetModele->uploadProfilePicture();
				$em->persist($objetModele);

				$em->flush();

				//return $this->redirect($this->generateUrl('D3hdv_diablo3_admin'));
				return $this->container->get('templating')->renderResponse('D3hdvDiablo3Bundle:Admin:ajouterobjetmodele.html.twig', array(
				    'form' => $form->createView(),
				   // 'ObjetModeles'=> $ObjetModeles,
				    'ObjetModele' => $objetModele				
				    ));
			}
		}

		return $this->render('D3hdvDiablo3Bundle:Admin:ajouterobjetmodele.html.twig', array(
		'form' => $form->createView(),
		//'ObjetModeles' => $ObjetModeles
		));
	}
	return $this->render('D3hdvDiablo3Bundle:Admin:ajouterobjetmodele.html.twig', array(
		'form' => $form->createView(),
		//'ObjetModeles'=> $ObjetModeles
		));
   }

   public function VoirObjetAction($idobjet)
   {
	$em = $this->getDoctrine()->getEntityManager();

	$Objet = $em->getRepository('D3hdvDiablo3Bundle:D3Objet')->find($idobjet);

	if (!$Objet) {
	    throw $this->createNotFoundException('Unable to find Objet entity.');
	}

	return $this->render('D3hdvDiablo3Bundle:Admin:voir_objet.html.twig', array(
	    'Objet' => $Objet


	));

   }

  public function VoirObjetSpeAction($idobjet)
   {
	$em = $this->getDoctrine()->getEntityManager();

	$Objet = $em->getRepository('D3hdvDiablo3Bundle:D3Objet')->find($idobjet);

	if (!$Objet) {
	    throw $this->createNotFoundException('Unable to find Objet entity.');
	}

	return $this->render('D3hdvDiablo3Bundle:Admin:voir_objet_spe.html.twig', array(
	    'Objet' => $Objet


	));

   }
   public function VoirObjetsAction($page)
   {
	$em = $this->getDoctrine()->getEntityManager();
	$total = $this->getDoctrine()->getRepository('D3hdvDiablo3Bundle:D3Objet')->createQueryBuilder('p')->getQuery()->getResult();
         
        /* total of résultat */
        $total_articles    = count($total);
        $articles_per_page = $this->container->getParameter('max_on_listepage');
        $last_page         = ceil($total_articles / $articles_per_page);
        $previous_page     = $page > 1 ? $page - 1 : 1;
        $next_page         = $page < $last_page ? $page + 1 : $last_page;
        /* résultat  à afficher*/
        $Objets          = $this->getDoctrine()->getRepository('D3hdvDiablo3Bundle:D3Objet')->createQueryBuilder('p')->setFirstResult(($page * $articles_per_page) - $articles_per_page)->setMaxResults($this->container->getParameter('max_on_listepage'))->getQuery()->getResult();
	if (!$Objets) {
		    throw $this->createNotFoundException('Unable to find Objets entity.');
		}
        return $this->render('D3hdvDiablo3Bundle:Admin:voir_objets.html.twig', array(
            'Objets' => $Objets,
            'last_page' => $last_page,
            'previous_page' => $previous_page,
            'current_page' => $page,
            'next_page' => $next_page,
            'total_objets' => $total_articles,
        ));
        return $this->render('D3hdvDiablo3Bundle:Admin:voir_objets.html.twig');


   }

   public function VoirObjetModeleAction($idobjetmodele)
   {
	$em = $this->getDoctrine()->getEntityManager();

	$ObjetModele = $em->getRepository('D3hdvDiablo3Bundle:D3ObjetModele')->find($idobjetmodele);

	if (!$ObjetModele) {
	    throw $this->createNotFoundException('Unable to find Objet Modele entity.');
	}

	return $this->render('D3hdvDiablo3Bundle:Admin:voir_objet_modele.html.twig', array(
	    'ObjetModele' => $ObjetModele


	));

   }
	
   public function VoirObjetsModeleAction($page)
   {
	$em = $this->getDoctrine()->getEntityManager();
	$total = $this->getDoctrine()->getRepository('D3hdvDiablo3Bundle:D3ObjetModele')->createQueryBuilder('p')->getQuery()->getResult();
         
        /* total of résultat */
        $total_articles    = count($total);
        $articles_per_page = $this->container->getParameter('max_on_listepage');
        $last_page         = ceil($total_articles / $articles_per_page);
        $previous_page     = $page > 1 ? $page - 1 : 1;
        $next_page         = $page < $last_page ? $page + 1 : $last_page;
        /* résultat  à afficher*/
        $ObjetsModele          = $this->getDoctrine()->getRepository('D3hdvDiablo3Bundle:D3ObjetModele')->createQueryBuilder('p')->setFirstResult(($page * $articles_per_page) - $articles_per_page)->setMaxResults($this->container->getParameter('max_on_listepage'))->getQuery()->getResult();
	if (!$ObjetsModele) {
		    throw $this->createNotFoundException('Unable to find Objets Modele entity.');
		}
        return $this->render('D3hdvDiablo3Bundle:Admin:voir_objets_modele.html.twig', array(
            'ObjetModeles' => $ObjetsModele,
            'last_page' => $last_page,
            'previous_page' => $previous_page,
            'current_page' => $page,
            'next_page' => $next_page,
            'total_objets_modele' => $total_articles,
        ));
        return $this->render('D3hdvDiablo3Bundle:Admin:voir_objets_modele.html.twig');
   }
 
   public function VoirCompteAction($idcompte)
   {
	$em = $this->getDoctrine()->getEntityManager();

	$D3Compte = $em->getRepository('D3hdvDiablo3Bundle:D3Compte')->find($idcompte);
	
	if (!$D3Compte) {
	    throw $this->createNotFoundException('Unable to find Compte Diablo3 entity.');
	}

	return $this->render('D3hdvDiablo3Bundle:Admin:voir_compte.html.twig', array(
	    'D3Compte' => $D3Compte


	));

   }
	
   public function VoirComptesAction($page)
   {
	$em = $this->getDoctrine()->getEntityManager();
	$total = $this->getDoctrine()->getRepository('D3hdvDiablo3Bundle:D3Compte')->createQueryBuilder('p')->getQuery()->getResult();
         
        /* total of résultat */
        $total_articles    = count($total);
        $articles_per_page = $this->container->getParameter('max_on_listepage');
        $last_page         = ceil($total_articles / $articles_per_page);
        $previous_page     = $page > 1 ? $page - 1 : 1;
        $next_page         = $page < $last_page ? $page + 1 : $last_page;
        /* résultat  à afficher*/
        $D3Comptes          = $this->getDoctrine()->getRepository('D3hdvDiablo3Bundle:D3Compte')->createQueryBuilder('p')->setFirstResult(($page * $articles_per_page) - $articles_per_page)->setMaxResults($this->container->getParameter('max_on_listepage'))->getQuery()->getResult();
	if (!$D3Comptes) {
		    throw $this->createNotFoundException('Unable to find Comptes Diablo 3 entity.');
		}
        return $this->render('D3hdvDiablo3Bundle:Admin:voir_comptes.html.twig', array(
            'D3Comptes' => $D3Comptes,
            'last_page' => $last_page,
            'previous_page' => $previous_page,
            'current_page' => $page,
            'next_page' => $next_page,
            'total_comptes' => $total_articles,
        ));
        return $this->render('D3hdvDiablo3Bundle:Admin:voir_comptes.html.twig');
   }

   public function VoirCoffreAction($idcoffre,$idCompte) // Porbléme
   {
	$em = $this->getDoctrine()->getEntityManager();
		$D3Objet='';
		$D3Coffre = $em->getRepository('D3hdvDiablo3Bundle:D3Coffre')->find($idcoffre);
		$D3Compte = $em->getRepository('D3hdvDiablo3Bundle:D3Compte')->find($idCompte);

		if (!$D3Coffre) {
		    throw $this->createNotFoundException('Unable to find Coffre de ce compte Diablo3 entity.');
		}
		if (!$D3Compte) {
		    throw $this->createNotFoundException('Unable to find ce compte Diablo3 entity.');
		}
		//return new Response($D3Coffre->getId());
		//$D3Objet = $em->getRepository('D3hdvDiablo3Bundle:D3CoffreD3Objet')->findByD3Coffre($D3Coffre->getId());
		$qb = $em->createQueryBuilder();

	       $qb->select('d')
	          ->from('D3hdvDiablo3Bundle:D3CoffreD3Objet', 'd')
	          ->where("d.D3Coffre = ?1 ")
	          ->setParameter(1, $D3Coffre);

	       $query = $qb->getQuery();               
	       $D3Objet = $query->getResult();

		if( empty($D3Objet) )
		{	//return new Response("pD1");
			return $this->render('D3hdvDiablo3Bundle:Admin:voir_coffre.html.twig', array(
			    'D3Coffre'      => $D3Coffre,
			    'D3Compte'	    => $D3Compte
		));
		}
		else
		{
		  	//return new Response("pD");
		    return $this->render('D3hdvDiablo3Bundle:Admin:voir_coffre.html.twig', array(
		    'D3Coffre'      => $D3Coffre,
		    'D3Compte'	    => $D3Compte,
		    'D3Objets'      => $D3Objet
			));
   		}
	}		
		

}
